2011/09/30

Recent entries from same category

  1. RapidJSON や simdjson よりも速いC言語から使えるJSONライブラリ「yyjson」
  2. コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」
  3. C++ で flask ライクなウェブサーバ「clask」書いた。
  4. C++ 用 SQLite3 ORM 「sqlite_orm」が便利。
  5. zsh で PATH に相対パスを含んだ場合にコマンドが補完できないのは意図的かどうか。

※ネタです

※UDFです


正誤表を書くのにしばらくこの本をちょっと眺めてみたら、SQLiteのUDFって簡単に作れるんだなー、と思った && そういやV8ってライブラリとして簡単にリンクできるはずだな、と思い出した ので、ついカッとなって作った。

sqlite3udf-jseval - GitHub

http://github.com/mattn/sqlite3udf-jseval

UDFうんぬn

ほとんど↑の本、全然関係ないと思ってたけど、やっぱりSQLiteのUDFについて全然書いてなかった。しょうがないので軽く紹介しておくと

UDFを追加する場合、SQLiteの再コンパイルは必要ない (しかるべき所に.soがおいてあればいい)
UDFはこの辺読んどけばだいたい分かる。

例えば文字列っぽいものを返すmyfuncっていうUDFを作りたい場合
SQLITE_EXTENSION_INIT1 static void js_eval_func(sqlite3_context *context, int argc, sqlite3_value **argv);
int sqlite3_extension_init(sqlite3 *db, char **errmsg, const sqlite3_api_routines *api);
の二つの関数を実装したmyfunc.cっていうコードを用意してあげて gcc -o myfunc.so myfunc.c `sqlite_config --cflags` -shared という風にコンパイルして(これはLinuxの場合)、しかるべき場所(LD_LIBRARY_PATHが通る場所)に置いた後、sqliteのシェルで > select load_extension("myfunc.so"); とやればいきなり使える。

sqlite3_value_textはアロケートした文字列を渡して、最終引数に開放関数を渡すというのがUDFのお作法らしい。strdupで確保したポインタは最終引数の関数でfreeする、みたいな。

動かす手順

で、今回作ったのはV8とリンクして、JSの文字列をevalしてくれるjs_evalというUDF。
多分試す人はいないと思うけど、動かすための手順を書くと

V8のビルド

V8を落としてきてビルドする。ただし、SQLiteのUDFは別に-fPICを付けなくてもおk。

js_eval.cppをコンパイル

V8をビルドしたディレクトリにもっていって
g++ -o js_eval.so js_eval.cpp `sqlite_config --cflags` -shared -Iinclude libv8.a -lpthread
そうすると、js_eval.soができるので、これをLD_LIBRARY_PATHが通ったディレクトリに置く

読み込むる

シェルに入って
> select load_extension("myfunc.so"); (※このUDF、食わせるものによってはSQLiteごと落ちるかもしれないので良い子のみんなは注意だ)

キターーーッ

すごい。
sqlite3udf1

全然
sqlite3udf2
役に立つ気がしない。
sqlite3udf3
というかSQLite力が低すぎてどうしたら面白くなるか思いつかない。これを発展させていってTEXTとかに突っ込んだJSONの中身を効率よく検索とか出来たら面白い&実用的なんだけど、道は遠そうだ。


参考
やったーJavaScriptの動くMySQLできたよー - 愛と勇気と缶ビール

しばらく 積ん読 していたこの本をちょっと眺めてみたら、 MySQL のUDFって簡単に作れるんだなー、と思った && そういや V8 って ライブラリ として簡単にリンクできるはずだな、と思い出した...

http://d.hatena.ne.jp/zentoo/20110925/1316961032
Posted at by